//Efetuar a decodificação por meio do código de huffman, descrito em 32 tabelas.



#include "huffman.h"
#include "bitstream.h"

int minimo (tabela *tb) {
		
		for (int i =0; i<tb.num-1;i++) {
			
			if ((tb->hlen[i])<(tb->hlen[i+1]))
				min=tab->hlen[i];
			else 
				min=tb->hlen[i+1];
		}
	
	return min;
	
	}


tabela tab0;
tab0.num=1;
tab0->bin=malloc(sizeof(int)*num);	
tab0->hlen=malloc(sizeof(int)*num);
tab0->bin=0;	
tab0->hlen=0;
tab0->prox=tab1;

tabela tab1;
tab1.num=4;
tab1->bin=malloc(sizeof(int)*num);	
tab1->hlen=malloc(sizeof(int)*num);
tab1->bin=[1,1,1,0];	
tab1->hlen=[1,3,2,3];
tab1->prox=tab2;

tabela tab2;
tab2.num=9;
tab2->bin=malloc(sizeof(int)*num);	
tab2->hlen=malloc(sizeof(int)*num);
tab2->bin=[1,2,1,3,1,1,3,2,0];	
tab2->hlen=[1,3,6,3,3,5,5,5,6];
tab2->prox=tab3;

tabela tab3;
tab3.num=9;
tab3->bin=malloc(sizeof(int)*num);	
tab3->hlen=malloc(sizeof(int)*num);
tab3->bin=[3,2,1,1,1,1,3,2,0];	
tab3->hlen=[2,2,6,3,2,5,5,5,6];
tab3->prox=tab4;

tabela tab4=tab3;
tab4->prox=tab5;

tabela tab5;
tab5.num=16;
tab5->bin=malloc(sizeof(int)*num);	
tab5->hlen=malloc(sizeof(int)*num);
tab5->bin=[1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0];	
tab5->hlen=[1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8];
tab5->prox=tab6;

tabela tab6;
tab6.num=16;
tab6->bin=malloc(sizeof(int)*num);	
tab6->hlen=malloc(sizeof(int)*num);
tab6->bin=[7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0];	
tab6->hlen=[3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7];
tab6->prox=tab7;

tabela tab7;
tab7.num=36;
tab7->bin=malloc(sizeof(int)*num);	
tab7->hlen=malloc(sizeof(int)*num);
tab7->bin=[1,2,10,19,16,10,3,3,7,10,5,3,11,4,11,17,8,4,12,11,18,15,11,2,7,6,9,14,3,1,6,4,5,3,2,0];	
tab7->hlen=[1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,0,10,10];
tab7->prox=tab8;

tabela tab8;
tab8.num=36;
tab8->bin=malloc(sizeof(int)*num);	
tab8->hlen=malloc(sizeof(int)*num);
tab8->bin=[7,5,9,14,15,7,6,4,5,5,6,7,7,6,8,8,5,15,6,9,10,5,1,11,7,9,6,4,1,14,4,6,2,6,0];	
tab8->hlen=[3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9];
tab8->prox=tab9;

tabela tab9=tab8;
tab9->prox=tab10;

tabela tab10;
tab10.num=64;
tab10->bin=malloc(sizeof(int)*num);	
tab10->hlen=malloc(sizeof(int)*num);
tab10->bin=[1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0];	
tab10->hlen=[1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10,10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11];
tab10->prox=tab11;

tabela tab11;
tab11.num=64;
tab11->bin=malloc(sizeof(int)*num);	
tab11->hlen=malloc(sizeof(int)*num);
tab11->bin=[3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,36,32,19,17,15,16,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0];	
tab11->hlen=[2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10,9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10];
tab11->prox=tab12;

tabela tab12;
tab12.num=64;
tab12->bin=malloc(sizeof(int)*num);	
tab12->hlen=malloc(sizeof(int)*num);
tab12->bin=[9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,5,3,1,0];	
tab12->hlen=[4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8,8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10];
tab12->prox=tab13;

tabela tab13;
tab13.num=256;
tab13->bin=malloc(sizeof(int)*num);	
tab13->hlen=malloc(sizeof(int)*num);
tab13->bin=[1,5,14,21,34,51,46,71,42,52,68,52,67,44,43,19,3,4,12,19,31,26,44,33,31,24,32,24,31,35,22,14,15,13,23,36,59,49,77,65,29,40,30,40,27,33,42,16,22,20,37,61,56,79,73,64,43,76,56,37,26,31,25,14,35,16,60,57,97,75,114,91,54,73,55,41,48,53,23,24,58,27,50,96,76,70,93,84,73,58,79,29,74,49,41,17,37,35,78,74,79,69,83,71,50,59,38,36,15,72,34,56,95,92,85,91,90,88,73,77,65,51,44,43,42,43,20,30,44,55,78,72,87,78,61,46,54,37,31,20,16,53,25,41,37,44,59,54,81,66,74,57,54,37,18,39,11,35,33,31,57,42,82,72,80,47,58,55,21,22,26,38,22,53,25,23,38,70,60,51,36,55,26,34,23,27,14,9,7,34,32,28,39,49,75,30,52,48,40,52,28,18,17,9,5,45,21,34,64,54,50,49,45,31,19,12,15,10,7,6,3,48,23,20,39,36,35,53,21,16,23,13,10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1];	
tab13->hlen=[1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12,6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12,13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11,12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11,11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13,14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12,12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15,16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14,15,15,16,16,19,18,19,16];
tab13->prox=tab14;

tabela tab15;
tab15.num=256;
tab15->bin=malloc(sizeof(int)*num);	
tab15->hlen=malloc(sizeof(int)*num);
tab15->bin=[7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,11,5,16,27,46,36,61,51,42,70,52,83,65,41,27,36,19,17,15,24,41,34,59,48,40,64,50,78,62,80,56,33,29,28,25,43,39,63,55,93,76,59,93,72,54,75,50,29,52,22,42,40,67,57,95,79,72,57,89,69,49,66,46,27,77,37,35,66,58,52,91,74,62,48,79,63,90,62,40,38,125,32,60,56,50,92,78,65,55,87,71,51,73,51,70,30,109,53,49,94,88,65,56,122,91,73,56,42,64,44,21,25,90,43,41,77,73,63,56,92,77,66,47,67,48,53,36,20,71,34,67,60,57,49,88,76,67,106,71,54,38,39,23,15,109,53,51,47,90,82,58,57,48,72,57,41,23,27,62,9,86,42,40,37,70,64,52,43,70,55,42,,25,29,18,11,11,118,68,30,55,50,46,74,65,49,39,24,16,22,13,14,7,93,44,39,38,34,63,52,45,31,52,28,19,14,8,9,3,123,60,58,53,47,43,32,22,37,24,17,12,15,10,2,1,71,37,34,30,28,20,17,26,21,16,10,6,8,6,2,0];	
tab15->hlen=[3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5,5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6,7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8,8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8,8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12,12,10,9,9,9,10,10,10,10,10,1,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11,11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10,11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12,13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13];
tab15->prox=tab16;

tabela tab16;
tab16.num=256;
tab16->bin=malloc(sizeof(int)*num);	
tab16->hlen=malloc(sizeof(int)*num);
tab16->bin=[1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,83,75,36,55,105,59,111,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,106,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,115,101,179,164,155,395,382,362,9,66,30,59,56,102,185,173,265,142,126,456,784,772,762,861,16,111,54,52,100,182,178,160,133,257,244,228,217,385,366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,889,884,8,85,84,81,159,156,133,260,249,416,401,392,383,727,713,708,7,154,76,73,141,131,256,118,426,406,394,384,735,231,710,352,11,139,129,67,125,247,233,229,219,393,743,737,720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,208,370,379,734,723,714,1735,883,877,876,1731,433,2,];	
tab16->hlen=[1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12,8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12,13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12,12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11,11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14,10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13,14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12,12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15,17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10,11,11,11,11,11,11,11,8];
tab16->prox=tab17;

tabela tab17=tab16;
tab17->prox=tab18;

tabela tab18=tab16;
tab18->prox=tab19;

tabela tab19=tab16;
tab19->prox=tab20;

tabela tab20=tab16;
tab20->prox=tab21;

tabela tab21=tab16;
tab21->prox=tab22;

tabela tab22=tab16;
tab22->prox=tab23;

tabela tab23=tab16;
tab23->prox=tab24;

tabela tab24;
tab24.num=256;
tab24->bin=malloc(sizeof(int)*num);	
tab24->hlen=malloc(sizeof(int)*num);
tab24->bin=[15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,194,182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,374,369,361,537,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3];	
tab24->hlen=[4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8,6,,6,7,7,,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7,8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8,9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9,9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11,11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,,7,7,7,7,7,7,7,7,7,7,8,8,8,8,4];


tabela tabA;
tabA.num=16;
tabA->bin=malloc(sizeof(int)*num);	
tabA->hlen=malloc(sizeof(int)*num);
tabA->bin=[1 5 4 5 6 5 4 4 7 3 6 0 7 2 3 1];	
tabA->hlen=[1 4 4 5 4 6 5 6 4 5 5 6 5 6 6 6];

tabela tabB;
tabB.num=16;
tabB->bin=malloc(sizeof(int)*num);	
tabB->hlen=malloc(sizeof(int)*num);
tabB->bin=[15 14 13 12 11 10 9 8 7 6 5 4 3 2 1];	
tabB->hlen=[4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4];

lista lt;
lt->ini =tab0;

void main (void) {
tabela tab;
int x,y,min,cod, flag=0 ;
if (normal_blocks) {
tab=lt->ini;
for (int i = 0; i< table_selct; i++)
tab = tab ->prox;  
min=minimo(tab,0);
   while(!flag) {
   cod=get_bit(fp,bits,min);
for (int i=0;i < tab->num; i++)
{
if (min==tab->hlen)
if (cod==tab->bin[i]) {
x=i/sqrt(tab->num);
y=i%sqrt(tab->num);
flag=1;
}
}	
min(tab,min);
}
}

else if (!count1table_select) 
tab=tabA;
else 
tab=tabB;
 
}

void main (void) {
	tabela tab;
	int x,y,min,cod ;
	
	if (normal_blocks) {
		tab=lt->0;
		for (int i = 0; i< table_selct; i++)
			tab = tab ->prox;  
	}


	else if (!count1table_select) 
		tab=tabA;
	else 
		tab=tabB;
				
		
	
		min=minimo(tab);
			
		get_bit(fp,e) 
				
		
		
		}



}
